﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

namespace Nirvana
{
    [CustomEditor(typeof(AnimationImportRule), true)]
    public class AnimationImportRuleEditor : Editor
    {
        private SerializedProperty floatOptimize, scaleOptimize, clearEmptyCurve;

        bool isHold1 = false, isHold2 = false;

        public override void OnInspectorGUI()
        {
            base.serializedObject.Update();
            GUI.color = Color.cyan;
            EditorGUILayout.HelpBox( "此规则文件只检测Animation，不对FBX等动画作规则检测" , MessageType.Info);
            GUI.color = Color.white;
            EditorGUILayout.Space();

            GUILayout.Label("匹配规则", GUITheme.LabelTitleStyle);
            GUILayoutEx.BeginContents();
            GUI.color = Color.yellow;
            EditorGUILayout.HelpBox("注意：规则文件只会检测同一父目录或同一级目录下的资源。\n", MessageType.None);
            GUI.color = Color.white;
            GUILayoutEx.EndContents();
            EditorGUILayout.Space();

            GUILayout.Label("AnimationClip数据信息", GUITheme.LabelTitleStyle);
            EditorGUILayout.HelpBox(
            "具体选中AnimationClip对象查看\n" +
            "Clip Count：7\n" +
            "Curves Pos:399 ,Quat:399, Euler:0, Scale:399, Muscles:0, Generic:0, PPtr:0\n" +
            "Curves Count:3990, Constant:2338(58.6%), Dense:0(0.0%), Stream:1652(41.4%)\n", MessageType.Info);
            EditorGUILayout.Space();
            EditorGUILayout.HelpBox(
                "Clip Count:动画剪辑总数\n" +
                "Curves(Pos,Rot&Scale): 由Unity用于动画化游戏对象位置、旋转或缩放的曲线总数,这些曲线用于不属于标准人形骨架的动画游戏对象.在对人形Avatar进行动画化时，这些曲线会显示额外非肌肉骨骼（例如武器，尾巴、飘逸的布料或悬垂的吊坠）的计数。如果您有人形动画并发现意外的非肌肉动画曲线，表示动画文件中可能有不必要的动画曲线。\n" +
                "Constant: 代表基本不变的数据，哪些数据用这个存储方式？很典型的就是scale曲线，基本上都是1，Constant的内存占用很小，基本上只有关键帧值数据，不含有切线数据\n" +
                "Dense: 采用的是线性插值方式，不含有切线数据，少内存。一般是线性插值的曲线会采用这种方式\n" +
                "Stream: 采用的是曲线插值方式，含有切线，时间等全部数据，与Dense方法相比，此数据占用的内存多得多\n", MessageType.None
                );
            EditorGUILayout.Space();
            //说明
            GUILayout.Label("优化思路", GUITheme.LabelTitleStyle);
            EditorGUILayout.HelpBox(
            "基本原则就是增加Constant数据，减少Stream数据。\n\n" +
            "1，float存储精度降低: 这个方法不仅会减少文件大小，而且还会减少内存。精度降低了，数据存储就会转变成Constant方式。默认存储每一帧transform信息的是10位精度的float格式数据，缩减此数据为3位精度float，视觉效果基本一样。可以Ctrl+D,从模型中把动画复制出来，通过文本查看。\n\n" +
            "2, 剔除常量的变化曲线 (变化小的关键帧)， 比较曲线的输入和输出变化，如果是基本稳定，即为常量。模型动画可以开启，UI动画不要开启，会造成一些Alpha等参数误判清掉问题。 \n" +
            "3, 去除模型动画文件的scale信息: 美术作的人物动画，是不需要用到scale的，所以动画数据里有大量的scale冗余信息，体现在constant数目过多，需要去掉scale信息，UI动画不要开启。\n", MessageType.None);

            EditorGUILayout.Space();

            EditorGUILayout.PropertyField(this.floatOptimize);
            EditorGUILayout.PropertyField(this.clearEmptyCurve);
            EditorGUILayout.PropertyField(this.scaleOptimize);
            EditorGUILayout.Space();
            if (GUILayoutEx.ActionButton("点击优化"))
            {
                AnimationImportRule rule = this.target as AnimationImportRule;
                rule.MathAnimation();
            }
            base.serializedObject.ApplyModifiedProperties();
        }

        private void OnEnable()
        {
            if (this.target == null)
            {
                return;
            }
            SerializedObject serializedObject = base.serializedObject;
            this.floatOptimize = serializedObject.FindProperty("floatOptimize");
            this.scaleOptimize = serializedObject.FindProperty("scaleOptimize");
            this.clearEmptyCurve = serializedObject.FindProperty("clearEmptyCurve");
            
        }

    }
}

